import glob
import re
from concurrent.futures import ThreadPoolExecutor
from compements.target_url import process_admin  # 导入重构后的函数


def main(admin_files=None):
    # 1. 如果没有指定文件，则查找所有admin_n.txt文件
    if admin_files is None:
        admin_files = glob.glob("./文档/admin_*.txt")
        if not admin_files:
            print("未找到admin_n.txt文件")
            return False

    # 2. 提取编号n（如admin_1.txt -> 1）
    tasks = []
    for file in admin_files:
        match = re.search(r'admin_(\d+)\.txt', file)
        if match:
            n = match.group(1)
            tasks.append((file, n))
        else:
            print(f"忽略无效文件：{file}")

    failed_files = []  # 记录失败的文件

    try:
        with ThreadPoolExecutor(max_workers=min(len(tasks), 5)) as executor:
            # 使用字典保存future对象和对应的文件信息
            futures = {}
            for file, n in tasks:
                future = executor.submit(process_admin, file, n)
                futures[future] = (file, n)

            # 等待所有任务完成并检查结果
            for future in futures:
                file, n = futures[future]
                try:
                    future.result()  # 获取任务执行结果，会抛出异常如果任务执行失败
                    print(f"任务 {file} 执行成功")
                except Exception as e:
                    print(f"任务 {file} 执行出错: {e}")
                    failed_files.append(file)  # 记录失败的文件

        if failed_files:
            print(f"以下文件执行失败: {failed_files}")
            return failed_files  # 返回失败的文件列表
        else:
            print("所有任务执行成功")
            return []  # 返回空列表表示全部成功

    except Exception as e:
        print(f"程序执行过程中发生异常: {e}")
        return admin_files  # 如果发生异常，返回所有文件作为失败文件


def run_with_retry(max_retries=3):
    """带重试功能的程序运行函数"""
    # 第一次运行所有任务
    print("程序第一次运行开始")
    result = main()  # 运行所有admin文件

    if isinstance(result, list) and len(result) == 0:
        print("所有任务执行成功")
        return

    failed_files = result if isinstance(result, list) else None

    # 如果有失败的任务，则针对失败的任务进行重试
    if failed_files:
        for attempt in range(1, max_retries + 1):
            print(f"第 {attempt} 次重试失败的任务: {failed_files}")
            result = main(failed_files)  # 只运行失败的文件
            if isinstance(result, list) and len(result) == 0:
                print(f"第 {attempt} 次重试成功，所有任务已完成")
                return
            else:
                failed_files = result
                if attempt < max_retries:
                    print(f"第 {attempt} 次重试仍有失败任务，5秒后继续重试...")
                    import time
                    time.sleep(5)
                else:
                    print("已达到最大重试次数，以下文件执行失败:")
                    for file in failed_files:
                        print(f"  - {file}")
    else:
        print("程序执行成功")


if __name__ == "__main__":
    run_with_retry()
